﻿/***************************************************************
 * 开发人员：网魂小兵@http://www.mozlite.com
 * 
 * 脚本文件数据库提供者。
 * 
 * 最后修改：2011-10-25
 * ************************************************************/
namespace Mozlite.Data
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Data.Common;

    /// <summary>
    /// 脚本文件数据库提供者。
    /// </summary>
    public abstract class ScriptDataProvider : ProviderBase<ScriptDataProvider>
    {
        /// <summary>
        /// 初始化类<see cref="T:Mozlite.Data.ScriptDataProvider"/>。
        /// </summary>
        /// <param name="factory">数据库提供者工厂实例。</param>
        protected ScriptDataProvider(DbProviderFactory factory) : base(factory) { }

        /// <summary>
        /// 脚本目录。
        /// </summary>
        /// <returns>返回脚本物理路径。</returns>
        public abstract string GetScriptPath();

        /// <summary>
        /// 执行脚本字符串。
        /// </summary>
        /// <param name="script">数据库字符串。</param>
        /// <returns>返回错误字符串。</returns>
        protected abstract string ExecuteScript(string script);

        /// <summary>
        /// 使用数据库事务执行脚本字符串。
        /// </summary>
        /// <param name="script">数据库字符串。</param>
        /// <returns>返回错误字符串。</returns>
        protected abstract string ExecuteTransactionScript(string script);

        /// <summary>
        /// 执行脚本。
        /// </summary>
        /// <param name="script">脚本字符串。</param>
        /// <param name="transaction">数据库事务实例对象。</param>
        /// <returns>返回错误字符串。</returns>
        public abstract string ExecuteScript(string script, DbTransaction transaction);

        /// <summary>
        /// 获取数据库引擎版本。
        /// </summary>
        /// <returns>返回版本实例对象。</returns>
        public abstract Version GetDatabaseEngineVersion();

        /// <summary>
        /// 获取数据库服务器读取器。
        /// </summary>
        /// <returns>返回数据库读取实例对象。</returns>
        public abstract IDataReader GetDatabaseServer();

        /// <summary>
        /// 获取数据库服务器版本读取器。
        /// </summary>
        /// <returns>返回数据库读取版本实例对象。</returns>
        public abstract IDataReader GetDatabaseVersion();

        /// <summary>
        /// 更新数据库版本。
        /// </summary>
        /// <param name="major">获取当前<see cref="T:System.Version"/>对象版本号的主要版本号部分的值。</param>
        /// <param name="minor">获取当前<see cref="T:System.Version"/>对象版本号的次要版本号部分的值。</param>
        /// <param name="build">获取当前<see cref="T:System.Version"/>对象版本号的内部版本号部分的值。</param>
        /// <param name="name">名称</param>
        public abstract void UpdateDatabaseVersion(int major, int minor, int build, string name);

        /// <summary>
        /// 获取版本。
        /// </summary>
        /// <returns>返回版本。</returns>
        public abstract Version GetVersion();

        /// <summary>
        /// 测试数据库连接。
        /// </summary>
        /// <param name="builder">为强类型连接字符串生成器提供基类。</param>
        /// <param name="owner">数据库所有者。</param>
        /// <param name="qualifier">数据表前缀。</param>
        /// <returns>返回执行错误信息。</returns>
        public abstract string TestDatabaseConnection(DbConnectionStringBuilder builder, string owner, string qualifier);
    }
}
